package br.uneb.telp.model;

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.vocabulary.*;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class UsuarioController extends Object {
    
    static final String inputFileName = "//Users//matheusmf//usuarios.rdf";
    
    public List<String> pesquisaPorNome (final String nome) {
    	
    	List<String> resultado = new ArrayList<String>();
        
        Model model = ModelFactory.createDefaultModel();
       
        // Carrega o arquivo rdf
        InputStream in = FileManager.get().open(inputFileName);
        if (in == null) {
            throw new IllegalArgumentException( "File: " + inputFileName + " not found");
        }
        
        // Ler o arquivo rdf para o model
        model.read( in, "" );
        
        // Seleciona todos os resources que possuem propriedade VCARD.FN
        // que contenha o nome passado
        StmtIterator iter = model.listStatements(
            new SimpleSelector(null, VCARD.FN, (RDFNode) null) {
                    @Override
                    public boolean selects(Statement s) {
                            return s.getString().contains(nome);
                    }
                });
        
        /*if (iter.hasNext()) {
            System.out.println("Resultado da pesquisa por "+nome+":");
            while (iter.hasNext()) {
                System.out.println("  " + iter.nextStatement()
                                              .getString());
            }
        } else {
            System.out.println("No "+ nome +" were found in the database");
        }*/
        
        if(iter.hasNext()){
        	resultado.add(iter.nextStatement().getString());
        }
        
        if(resultado.size() == 0){
        	resultado.add("Nenhum '"+ nome + "' foi encontrado.");
        }
        
        return resultado;
    }
    
    public List<String> sparql(String nome){
    	List<String> resultado = new ArrayList<String>();
    	
    	 InputStream in = FileManager.get().open(inputFileName);

    	Model model = ModelFactory.createDefaultModel();
    	model.read(in,"");
    	//in.close();

    	// Create a new query
    	String queryString = 
    		"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
    		"PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> " +
    		"SELECT ?Name " +
    		"WHERE " + 
    		"{ " +
    			"?person vcard:FN  ?Name " +
    			"FILTER (?Name = '"+ nome + "')" +
    		"}";

    	Query query = QueryFactory.create(queryString);

    	// Execute the query and obtain results
    	QueryExecution qe = QueryExecutionFactory.create(query, model);
    	com.hp.hpl.jena.query.ResultSet results = qe.execSelect();
    	if(results.hasNext()){
    		resultado.add(results.next().getLiteral("?Name").toString());
    	}
    	// Output query results	
    	//ResultSetFormatter.out(System.out, results, query);

    	// Important - free up resources used running the query
    	qe.close();
    	
    	return resultado;
    }
    
    public static void main (String args[]) {
		UsuarioController usuarioController = new UsuarioController();
		List<String> resultadoBusca = usuarioController.pesquisaPorNome("Barros");
		List<String> resultadoSparql = usuarioController.sparql("Vitor Santos");
		for (String resultado : resultadoBusca) {
			System.out.println(resultado);
		}
		for (String resultado : resultadoSparql) {
			System.out.println(resultado);
		}
	}
}

